home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / percpu_counter.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  2KB  |  109 lines

  1. #ifndef _LINUX_PERCPU_COUNTER_H
  2. #define _LINUX_PERCPU_COUNTER_H
  3. /*
  4.  * A simple "approximate counter" for use in ext2 and ext3 superblocks.
  5.  *
  6.  * WARNING: these things are HUGE.  4 kbytes per counter on 32-way P4.
  7.  */
  8.  
  9. #include <linux/preempt.h>
  10. #include <linux/config.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/smp.h>
  13. #include <linux/threads.h>
  14. #include <linux/percpu.h>
  15.  
  16. #ifdef CONFIG_SMP
  17.  
  18. struct percpu_counter {
  19.     spinlock_t lock;
  20.     long count;
  21.     long *counters;
  22. };
  23.  
  24. #if NR_CPUS >= 16
  25. #define FBC_BATCH    (NR_CPUS*2)
  26. #else
  27. #define FBC_BATCH    (NR_CPUS*4)
  28. #endif
  29.  
  30. static inline void percpu_counter_init(struct percpu_counter *fbc)
  31. {
  32.     spin_lock_init(&fbc->lock);
  33.     fbc->count = 0;
  34.     fbc->counters = alloc_percpu(long);
  35. }
  36.  
  37. static inline void percpu_counter_destroy(struct percpu_counter *fbc)
  38. {
  39.     free_percpu(fbc->counters);
  40. }
  41.  
  42. void percpu_counter_mod(struct percpu_counter *fbc, long amount);
  43.  
  44. static inline long percpu_counter_read(struct percpu_counter *fbc)
  45. {
  46.     return fbc->count;
  47. }
  48.  
  49. /*
  50.  * It is possible for the percpu_counter_read() to return a small negative
  51.  * number for some counter which should never be negative.
  52.  */
  53. static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
  54. {
  55.     long ret = fbc->count;
  56.  
  57.     barrier();        /* Prevent reloads of fbc->count */
  58.     if (ret > 0)
  59.         return ret;
  60.     return 1;
  61. }
  62.  
  63. #else
  64.  
  65. struct percpu_counter {
  66.     long count;
  67. };
  68.  
  69. static inline void percpu_counter_init(struct percpu_counter *fbc)
  70. {
  71.     fbc->count = 0;
  72. }
  73.  
  74. static inline void percpu_counter_destroy(struct percpu_counter *fbc)
  75. {
  76. }
  77.  
  78. static inline void
  79. percpu_counter_mod(struct percpu_counter *fbc, long amount)
  80. {
  81.     preempt_disable();
  82.     fbc->count += amount;
  83.     preempt_enable();
  84. }
  85.  
  86. static inline long percpu_counter_read(struct percpu_counter *fbc)
  87. {
  88.     return fbc->count;
  89. }
  90.  
  91. static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
  92. {
  93.     return fbc->count;
  94. }
  95.  
  96. #endif    /* CONFIG_SMP */
  97.  
  98. static inline void percpu_counter_inc(struct percpu_counter *fbc)
  99. {
  100.     percpu_counter_mod(fbc, 1);
  101. }
  102.  
  103. static inline void percpu_counter_dec(struct percpu_counter *fbc)
  104. {
  105.     percpu_counter_mod(fbc, -1);
  106. }
  107.  
  108. #endif /* _LINUX_PERCPU_COUNTER_H */
  109.